package oop;

/*练习2：
 * 设计一个继承结构来模拟不同类型的员工。
创建一个父类 Employee，包含以下属性：
name（员工姓名）
salary（基本工资）
为 Employee 提供一个方法 displayInfo()，打印员工的姓名和基本工资。
创建两个子类：
Manager：在 Employee 的基础上增加属性 bonus（奖金）。
Developer：在 Employee 的基础上增加属性 programmingLanguage（主要编程语言）。
重写 displayInfo() 方法，以包括各自特有的信息（如奖金和编程语言）。
 * */
public class Practice02 {
    public static void main(String[] args) {
        Employee employee = new Employee("工程师", 500000);// 创建父类对象
        employee.displayInfo();

        Manager engineer1 = new Manager("管理层", 1_000_000, 2_00_000);// 创建子类1 对象
        engineer1.displayInfo();

        Developer engineer2 = new Developer("技术层", 2_000_000, "Java");// 创建子类2 对象
        engineer2.displayInfo();
    }
}

class Employee{ //定义一个父类
    private String name;
    private double salary;

    // 有参构造函数初始化字段
    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }
    public Employee(){

    }
    //定义 get 和 set 方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }

    public void displayInfo(){
        System.out.println("父类中的方法实现："+this.name+"\t"+this.salary);
    }
}

class Manager extends Employee{
    private double bonus;
    public Manager(String name, double salary, double bonus){
        super(name, salary);
        this.bonus = bonus;
    }
    public Manager(){

    }
    //定义 get 和 set 方法
    public double getBonus() {
        return bonus;
    }
    public void setBonus(double bonus) {
        this.bonus = bonus;
    }

    public void displayInfo(){
        //由于name 和 salary 是父类中的私有属性，因此在子类中不可以通过 this. 的方式直接获取，而是需要使用父类中提供的 get 方法获取，而 bonus是子类中独有定义的属性
        System.out.println("子类1中的方法实现："+this.getName()+"\t"+this.getSalary()+"\t"+this.bonus);
    }
}
class Developer extends Employee{
    private String programmingLanguage;
    public Developer(String name, double salary, String programmingLanguage){
        super(name, salary);  // 调用父类的构造函数
        this.programmingLanguage = programmingLanguage;
    }
    public Developer(){

    }
    //定义 get 和 set 方法
    public String getProgrammingLanguage() {
        return programmingLanguage;
    }

    public void setProgrammingLanguage(String programmingLanguage) {
        this.programmingLanguage = programmingLanguage;
    }

    public void displayInfo(){
        System.out.println("子类2中的方法实现："+this.getName()+"\t"+this.getSalary()+"\t"+this.programmingLanguage);
    }
}
